# 理论基础

# 并发和并行

「并发」强调的是可以一起「出『发』」,「并行」强调的是可以一起「执『行』」。

并发需要存在多个任务,这些任务在重叠的时间段内以无序的方式启动,运行和完成。

并行是指多个任务或唯一任务的多个部分在物理上同时运行的情况。

与可以一起出发的并发(concurrent)相对的是不可以一起出发的顺序(sequential):

  • 顺序:上一个开始执行的任务完成后,当前任务才能开始执行
  • 并发:无论上一个开始执行的任务是否完成,当前任务都可以开始执行

与可以一起执行的并行(parallel)相对的是不可以一起执行的串行(serial):

  • 串行:有一个任务执行单元,从物理上就只能一个任务、一个任务地执行
  • 并行:有多个任务执行单元,从物理上就可以多个任务一起执行

# 进程和线程

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。

线程是共享进程中的数据的,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。

进程之间的通信需要以通信的方式(IPC) 进行。

# CPU 调度

  • 分时调度:所有线程轮流使用 CPU,平均分配每个线程占用 CPU 的时间。
  • 抢占式调度:优先让优先级高的线程使用 CPU,如果线程的优先级相同,随机选择一个,JVM 使用抢占式调度。

# 参考链接